package cn.itcast.up32.up_web.service.impl;

import cn.itcast.up32.up_web.bean.dto.ModelDto;
import cn.itcast.up32.up_web.bean.dto.TagDto;
import cn.itcast.up32.up_web.bean.po.ModelPo;
import cn.itcast.up32.up_web.bean.po.TagPo;
import cn.itcast.up32.up_web.repo.ModeRepo;
import cn.itcast.up32.up_web.repo.TagRepo;
import cn.itcast.up32.up_web.service.TagService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 标签的业务层实现类
 */
@Service
public class TagServiceImpl implements TagService {
    /**
     * 保存标签的数据
     *
     * @param tags
     */
    @Autowired
    private TagRepo tagRepo;
    @Autowired
    private ModeRepo modeRepo;
    @Override
    public void save(List<TagDto> tags) {
        //将TagDto==>TagPo
//       for (TagDto dto : tags) {
//           TagPo convert = convert(dto);
//       }
        //方案三
        /*List<TagPo> collect = tags.stream().map((dto) -> {
            return convert(dto);
        }).collect(Collectors.toList());*/
        //方案4
        List<TagPo> list = tags.stream().map(this::convert).collect(Collectors.toList());
        //将TagPo进行保存
        //保存的时候设置父id

        //方案1:逐个保存
        if (list.size() == 3) {
            //保存一级,获取一级的id
            //先去数据库查看有没有这标签,如果有就直接使用,没有就保存
            TagPo tmp = null;
            TagPo tagPo1 = list.get(0);
            tmp = tagRepo.findByNameAndLevelAndPid(tagPo1.getName(), tagPo1.getLevel(), tagPo1.getPid());
            if (tmp == null) {
                tmp = tagRepo.save(tagPo1);
            }
            //保存二级,使用一级的id作为二级的pid,保存后获取二级的id
            TagPo tagPo2 = list.get(1);
            tagPo2.setPid(tmp.getId());
            tmp = tagRepo.findByNameAndLevelAndPid(tagPo2.getName(), tagPo2.getLevel(), tagPo2.getPid());
            if (tmp == null) {
                tmp = tagRepo.save(tagPo2);
            }
            //保存三级,使用二级的id作为三级的pid
            TagPo tagPo3 = list.get(2);
            tagPo3.setPid(tmp.getId());
            tmp = tagRepo.findByNameAndLevelAndPid(tagPo3.getName(), tagPo3.getLevel(), tagPo3.getPid());
            if (tmp == null) {
                tmp = tagRepo.save(tagPo3);
            }
        }

        //方案2:使用循环

    }

    @Override
    public List<TagDto> findByLevel(Integer level) {
        return tagRepo.findByLevel(level).stream().map(this::convert).collect(Collectors.toList());
    }

    @Override
    public List<TagDto> findByPid(Long pid) {
        return tagRepo.findByPid(pid).stream().map(this::convert).collect(Collectors.toList());
    }

    /**
     * 保存4级模型和标签
     * @param tag
     * @param model
     */
    @Override
    public void addTagModel(TagDto tag, ModelDto model) {
        //先保存tag, 获取当前4级标签的id
        TagPo tagPo = convert(tag);
        TagPo saveTagPo = tagRepo.save(tagPo);
        //拿到4级标签的id
        ModelPo modelPo = convert(model, saveTagPo.getId());
        modeRepo.save(modelPo);
    }
    private ModelPo convert(ModelDto modelDto, Long id) {
        ModelPo modelPo = new ModelPo();
        modelPo.setId(modelDto.getId());
        modelPo.setTagId(id);
        modelPo.setName(modelDto.getName());
        modelPo.setMainClass(modelDto.getMainClass());
        modelPo.setPath(modelDto.getPath());
        modelPo.setSchedule(modelDto.getSchedule().toPattern());
        modelPo.setCtime(new Date());
        modelPo.setUtime(new Date());
        modelPo.setState(modelDto.getState());
        modelPo.setArgs(modelDto.getArgs());
        return modelPo;
    }


    private TagDto convert(TagPo po) {
        TagDto tagDto = new TagDto();
        tagDto.setId(po.getId());
        tagDto.setLevel(po.getLevel());
        tagDto.setName(po.getName());
        tagDto.setPid(po.getPid());
        tagDto.setRule(po.getRule());
        return tagDto;
    }

    /**
     * 将TagDto转换为TagPo对象
     *
     * @param dto
     */
    private TagPo convert(TagDto dto) {
        TagPo tagPo = new TagPo();
        //dto有什么数据,就传什么数据
        tagPo.setId(dto.getId());
        //如果当前等级是 1 直接设置 pid =-1
        if (dto.getLevel() == 1) {
            tagPo.setPid(-1L);
        } else {
            tagPo.setPid(dto.getPid());
        }
        tagPo.setName(dto.getName());
        tagPo.setLevel(dto.getLevel());
        tagPo.setRule(dto.getRule());
        return tagPo;
    }
}
